/**
 *
 *
 * some() 方法用于检测数组中的元素是否满足指定条件（函数提供）。
 * some() 方法会依次执行数组的每个元素：
 *   如果有一个元素满足条件，则表达式返回true , 剩余的元素不会再执行检测。
 *   如果没有满足条件的元素，则返回false。
 *
 * Created by Adi on 16/10/5.
 */

import { is } from 'immutable';
const keys = Object.keys;

export const equal = (context, nextProps = {}, nextState = {}) => {
  if (nextProps === null || nextProps === undefined) {
    //console.debug('equal => null or undefined');
    return false;
  }

  if (nextState === null || nextState === undefined) {
    return true;
  }

  let { state, props } = context;

  const nextStateKeys = keys(nextState);
  const nextPropsKeys = keys(nextProps);

  // 先从数据的长度判断
  if (nextStateKeys.length !== keys(state).length || nextPropsKeys.length !== keys(props).length) {
    return true;
  }

  // 再按key逐个比较数据是否相等
  let isUpdate = nextStateKeys.some(
    item => state[item] !== nextState[item] && !is(state[item], nextState[item])
  );

  if (isUpdate) {
    return true;
  }

  return nextPropsKeys.some(
    item => props[item] !== nextProps[item] && !is(props[item], nextProps[item])
  );
};

export default equal;
